#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <vector>

typedef void (*handler_t) (); // 函数指针
std::vector<handler_t> handlers;

void fun_one()
{
    printf("任务1\n");
}
void fun_two()
{
    printf("任务2\n");
}
// 设置对应的方法回调
// 以后想让父进程闲了执行任何方法的时候，只要向Load里面注册，就可以让父进程执行对应的方法了
void Load()
{
    handlers.push_back(fun_one);
    handlers.push_back(fun_two);

}



int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        int cnt = 5;
        while(cnt--)
        {
            printf("我是子进程,cnt:%d\n",cnt);
            sleep(1);
        }
        exit(10);
    }
    else 
    {
       int quit = 0;
       while(!quit)
       {
            int status = 0;
            pid_t res = waitpid(-1,&status,WNOHANG);
            if(res > 0)
            {
                // 等待成功 子进程退出
                printf("子进程等待成功，退出码：%d\n",WEXITSTATUS(status));
                quit = 1;
            }
            else if(res == 0)
            {
                // 等待成功 子进程未退出
                printf("子进程还在运行中，暂时还没有退出，父进程可以再等一等，或处理其他事情\n");
                if(handlers.empty()) Load();
                handlers[0]();
                sleep(1);
            }
            else 
            {
                // 等待失败
                printf("wait失败\n");
                quit = 1;
            }
    

       }
        




        
        //int status = 0;
        //// 只有子进程退出，父进程才会waitpid函数返回[父进程依旧还活着]
        //// wait/waitpid可以在目前的情况下，让进程退出具有一定的顺序性
        //// 将来可以让父进程进行更多的收尾工作
        //// id > 0 指定进程
        //// id == 0 TODO
        //// id == -1 等待任意个子进程的退出，等价于wait()
        //// options:默认为0，代表阻塞等待，WNOHANG：叫做非阻塞等待
        //pid_t result = waitpid(id,&status,0);// 默认是在阻塞状态等待子进程状态变化(就是退出)
        //if(result > 0)
        //{
        //    // 可以不这么检测
        //    // printf("父进程等待成功，退出信号：%d,退出码：%d\n",status & 0x7F,(status >> 8) & 0xFF);
        //    if(WIFEXITED(status))
        //    {
        //        printf("子进程执行完毕，子进程退出码：%d\n",WEXITSTATUS(status));
        //    }
        //}
        //else 
        //{
        //    printf("父进程等待失败,退出码：%d\n",WIFEXITED (status));
        //}
    }



    return 0;
}
